package cn.ljw.mybatis;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;

import java.sql.Connection;

/**
 * @author 一朝风月
 * @date 2024/9/21 21:19
 * @Code 面向注解面向卿，终无解释再无你
 * @description Mapper代理工厂 Mybatis动态代理的核心
 * MapperProxyFactory 通过 JDK 动态代理机制，
 * 为 Mapper 接口生成代理对象，代理对象在执行方法时，
 * 会通过 MapperProxy 和 MapperMethod 来实现 SQL 映射和执行。
 */
//@RequiredArgsConstructor
@AllArgsConstructor
@NoArgsConstructor
public class MapperProxyFactory <T>{
    private   Class<T> mapperInterface;

//    public Object newInstance(WinterFlySqlSession.MapperProxy mapperProxy) {
//        return MapperProxy.newInstance(mapperInterface, mapperProxy);
//    }

//    public static Object newInstance(MapperProxy mapperProxy) {
//        return MapperProxy.newInstance(mapperInterface, mapperProxy);
//    }
    private   LjwConnection ljwConnection;
    private   Connection connection;

    // 构造函数初始化连接
    public MapperProxyFactory(Connection connection) {
        this.connection = connection;
    }
    public static <T> Object newInstance(Class<T> type, MapperProxy winterFlySqlSession) {
        return MapperProxy.newInstance(type, winterFlySqlSession);
    }
    /**
     * 获取指定类型的 Mapper 对象。
     * 使用泛型来返回指定类型的 Mapper。
     *
     * @param type Mapper 的类型
     * @param <T>  泛型类型
     * @return 返回指定类型的 Mapper 对象
     */

    @SneakyThrows
    public <T> T getMapper(Class<T> type) {
        try {
            // 通过连接获取 Mapper 对象
            return ljwConnection.getMapper(type);
        } catch (Exception e) {
            // 处理获取 Mapper 过程中可能出现的异常
            throw new RuntimeException("Failed to get Mapper for type: " + type.getName(), e);
        }
    }
}
